<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>

  // //模拟ajax请求 请求数据 回调地狱callBack hell
  // //类比 文件操作 打开 读取 修改 关闭
  // console.log(`请求A数据--`);
  // setTimeout(()=>{
  //   console.log(`A数据成功`);
  //   console.log(`请求b数据--`);
  // setTimeout(()=>{
  //   console.log(`b数据成功`);
  //   console.log(`请求c数据--`);
  // setTimeout(()=>{
  //   console.log(`c数据成功`);

  // },1000)
  // },2000)
  // },3000)

  // //回调函数  定义了 没有调用 代码体执行了
  // function a (){
  //   console.log(11);
  // }
  // a()


  // console.log(22);


  // 什么叫异步什么叫同步？
  // 举个例⼦来说，同步就是你先刷⽛接着吃早饭，
  // 异步就是你在刷⽛的同时厨房在煮着粥.
  // 回调函数
  // 回调函数，就是一个函数作为另外一个函数的参数，就称为回调函数
  //回调不都是异步的 可以是同步回调 也可以是异步回调
  // console.log("hello world!");

  // setTimeout(()=>{
  // 	console.log("执行setTimeout完毕。")
  // },2000);
  // 但是，如果我们希望先执行setTimeout，待其执行完毕再打印hello world!应该怎么办？
  // 老办法

  //什么是回调函数
  /* 
  按照 MDN 的描述：回调函数是作为参数传给另一个函数的函数，然后通过在外部函数内部调用该回调函数以完成某种操作。

让我用人话解释一下，回调函数是一个函数，将会在另一个函数完成执行后立即执行。回调函数是一个作为参数传给另一个 JavaScript 函数的函数。这个回调函数会在传给的函数内部执行。

在 JavaScript 中函数被看作是一类对象。对于一类对象，我们的意思是指数字、函数或变量可以与语言中的其他实体相同。作为一类对象，可以将函数作为变量传给其他函数，也可以从其他函数中返回这些函数。

可以执行这种操作的函数被称为高阶函数。回调函数实际上是一种模式。 “模式”一词表示解决软件开发中常见问题的某种行之有效的方法。最好将回调函数作为回调模式去使用。
  
  */



  //就是指把一个函数作为参数，放到另一个函数中（调用）
  //定义第一个一个函数
  // 异步都是回调 回调不一定是异步
  //arr.slice()
  console.dir(Array);
  let arr = [`a`, `b`, `c`, `d`]
  console.dir(arr);
  //第一个参数 从几开始
  //  第二个参数 到几结束
  //返回值是新的一个数组
  // let newArr=arr.slice(2,4)
  // let newArr=arr.slice(0,2)
  // let newArr=arr.slice(-1)
  // arr.prototype.bb=function hello(){ console.log(`hellow`);}

  // let newArr = arr.slice(0, -1)
  // function hellowWorld(a, b, c, d) {
  //   console.log(a);
  //   console.log(b);
  //   console.log(c);
  //   console.log(d);
  //   console.log("hello world!");
  //   console.log(arguments.length); //实参的数量
  // }
  // // 定义第二个函数
  // function trigger(callback) {
  //   // callback 传进去的第一个函数

  //   // console.log(callback === hellowWorld);
  //   // console.log(callback);
  //   // console.log(hellowWorld);
  //   //异步代码
  //   setTimeout(() => {
  //     console.log("执行setTimeout完毕。")
  //     //调用第一个函数
  //     callback(1, 2, 3) //====   console.log(`hello world!`);
  //     // console.log(callback.arguments.length);
  //     console.dir(callback);
  //   }, 2000);
  //   // callback()
  // }
  // // 调用第二个函数把第一个函数作为实参传进去
  // trigger(hellowWorld)


  // function trigger (){
  // 	setTimeout(()=>{
  // 	console.log("执行setTimeout完毕。");
  // 	console.log("hello world!");
  // },2000);
  // }
  // trigger()

  // 总结
  //当另一个函数满足某个条件  去调用这个函数时 它就是回调函数
  // 把函数作为参数去传入其它函数体去调用这种思想即回调






  // 新办法
  // async function callback(){
  //   await new Promise((resolve,reject)=>{
  //     setTimeout(()=>{
  // 	console.log("执行setTimeout完毕。")
  //     resolve()
  // },2000);
  //   })

  //   console.log("hello world!");
  // }
  // callback()


  // ["a"]
  // [a]
  // 1、如果是你定义的变量，不能加引号。
  // 因为在大多数语言里面，单引号（或双引号）里面的内容表示的都是字符串。
  // 2、如果是你定义的字符串，就必须加引号。
  // var str = "this is a book!";
  // document.write("str");//这是变量；输出this is a book!
  // document.write(str);//这是字符串。输出str;

  // let person = {
  //           name: `jack`,
  //       }
  //       let result1 = person[name]
  //       let result2 = person["name"]
  //       console.log(result1); //undefined
  //       console.log(result2); //jack
 
  //成员访问 
  // [] .
  // 对象. 操作符 点后面的属性 不会作为变量 而是作为key 直接设置给对象
  // 对象[] 操作符 [这里里面可以是变量，先解析变量得到值，在把值变为字符串，设置给对象当作属性名 ，设置给对象]


  // let frieng= "girlfrieng"
  // let person={
  //   name:xiaowang,
  //   say(){
  //     console.log(`hellow`);
  //   }
  // }
  // person.age=18
  // person["high"]=`170cm`
  // person[frieng]="男"

  // 创建函数的三种方式

  // function fn(){}


  // let fn1 =new Function("A","console.log(A);")

  // let fn2 =function(){}




</script>

</html>